Nmap 是一個功能完整的網路掃描工具,用於發現主機、掃描 port、辨識服務版本、做 OS 指紋辨識,還有可擴充的 Nmap Scripting Engine (NSE) 來跑自動化檢查。
它支援很多掃描類型(例如 TCP SYN(半開)掃描、TCP Connect(完整三次握手)掃描、UDP 掃描、各種特殊 flag scan 等),每種在速度、偵測率、是否會被記錄上有不同權衡。
Nmap 的 OS 偵測不是只看 banner,而是做 TCP/IP stack fingerprinting:發一系列有設計的封包,檢查回應中各種位元層級行為(TCP options、初始 sequence、IP ID、ICMP 回應等),比單純看 banner 更可靠。它把結果比對到龐大的指紋資料庫來猜 OS。
Nmap 的版本/服務偵測:
Nmap 有一個 nmap-service-probes 的 probe 庫:發不同的 probe 給已知 open port,並以一組匹配規則 (match rules) 解析回應,推斷服務型態、應用名稱與版本(例如 Apache、OpenSSH 版本等)。也就是「主動詢問 + 指紋比對」。
NSE(Nmap Scripting Engine)是 Nmap 的擴充系統,允許用 Lua 語言寫小腳本來自動化掃描、蒐集資訊、做弱點或服務檢測,並且這些腳本可與 Nmap 的掃描流程平行執行以提升功能。
接下來:Nmap vs 這幾天自製的 Scanner(實務差異、優缺點比較)
1.掃描方法與權限:
Nmap 可以做 SYN (半開) 掃描,需 raw socket/root 權限,比較快且較「stealth」。若無 raw 權限,會改用 TCP Connect(跟你用 Socket.connect() 的行為類似)。
自製 scanner(像 Java Socket.connect)通常做的是 TCP Connect(完整三次握手),不需 root,但比較慢且較容易被記錄。
2.偵測深度(精確度):
Nmap 有服務 probe 庫與大量指紋(service + OS),能做版本/OS 判斷與更精準的服務辨識。
//(在 Nmap 裡,probe 就是 Nmap 發送到一個 open port 的「測試封包或字串」,目的在誘發服務回應,然後根據回應去辨識服務類型與版本。)
自製 scanner 若只做 connect + optional simple banner(HEAD / 或 passive read),只能得到「port open/closed」與有限 banner,容易漏判或誤判(不同服務需要不同 probe)。
3.速度與效能:
Nmap 的實作非常優化(raw packets、重試策略、分組、時間控制、複雜的 timing templates),在大範圍掃描時比簡單的 blocking-socket 程式更快、更可控。
自製 scanner 的優勢是簡單、可教學、可修改;缺點是當面對大量 timeout 或要高並發時,除非用 non-blocking/NIO 或大量 thread,否則效率較低。
總結來說:
Nmap = 完整、成熟、功能強大的掃描平台(OS 指紋、版本偵測、腳本自動化、各種掃描技術與優化)。
自製 scanner = 好學習、可控制,但功能與精確度有限(沒指紋庫、沒 NSE、沒 raw-packet 優化),適合教學或簡單情況。
//raw-packet(原始封包)掃描就是自己在應用層直接構造/送出 IP/TCP/UDP 等封包,並在資料鏈路層(或用 pcap)攔截回應。它比用高階 socket 更靈活、更快、能做半開(SYN)掃描與精細封包操控,但需要系統權限、更多錯誤處理、且有較高的網路/安全風險。
//SYN 掃描(又稱 half-open scan 或 -sS)就是只送出 TCP SYN 封包來探測目標 port 是否回 SYN+ACK(表示 open),收到後立刻送 RST 終止,不完成三次握手。這樣可以比完整 connect()(三次握手)更快、較少完成連線的成本,也稍微「不那麼顯眼」。